import java.io.IOException
import java.net.MalformedURLException
import java.text.MessageFormat

import scala.io
import scala.io.StdIn
//import scala.sys.process.processInternal.URL

/**
 * 控制结构和函数
 */
object chapter2 {

  def main(args: Array[String]): Unit = {
    // 常用变量及输出方法等
    val name1 = "TheKernel"
    val age1 = 10;
    print(f"Hello $name1, your age is ${age1+0.5}%7.2f")
    val name = StdIn.readLine("Please input your name: ")  // 用于从控制行读入
    print("Your age: ")
    val age = StdIn.readInt();
    // s: 可以转义但不能格式化， f: 可以转义并格式化 raw: 不转义任何
    print(s"Hello $name, your age is ${age+0.5}")

    // for 高级用法
    for (i <- 1 to 3; j <- 1 to 3) print(i, j)
    println()
    // 守卫(以 if 开头的 Boolean 表达式)
    for (i <- 1 to 3; j <- 1 to 3; if i != j) print(i, j)
    println()
    // 在 for 中定义变量
    for (i <- 1 to 3; from = 4 - i; j <- from to i) print(i, j)
    println()
    // yield 生成器 Vector
    val tt = for (i <- 1 to 10) yield i
    println(tt)
    // 类型兼容型
    for (i <- 0 to 10; c <- "HelloTest") print((c+i).toChar)

    // 函数
    // 默认参数
    def decorate(str: String = "Test", left: String = "[", right: String = "]"): Unit = {
      println(left + str + right)
    }
    decorate()
    // 变长参数
    def sum(nums: Int*) = {
      var total = 0
      for (i <- 0 until nums.length)
        total += nums(i)
      total
    }
    println(sum(1, 2, 3, 4, 5, 6))
    // 将参数当做参数序列传入函数 (_*)
    val s = sum(1 to 5: _*)
    println(s)
    // 当传入的序列为 Object 时需手动进行基本类型转换
    val test = MessageFormat.format("test", "gaga", 42.asInstanceOf[AnyRef])
    println(test)

    def box(s: String): Unit = {
      val border = "-" * (s.length + 2)
      print(f"$border\n|$s|\n$border\n")
      print(f"$border%n|$s|%n$border%n")
    }
    box("Hello")
    // lazy 懒值: 一般用于文件读写(在第一次调用时初始化)
    lazy val file = scala.io.Source.fromFile("test").mkString

    // 捕获异常
    def mySqrt(x: Int) = {
      if (x >= 0) {
        math.sqrt(x)
      } else {
        throw new IllegalArgumentException("x should not be negative")
      }
    }
    // 捕获异常(采取模式匹配)
//    def process(url: URL): Unit = {
//    }
//    val url = new URL("http://www.baidu.com")
//    try {
//      process(url)
//    } catch {
//      case ex:
//        IOException => ex.printStackTrace()
//      // default
//      case _:
//        MalformedURLException => println(s"Bad URL: $url")
//    } finally {
//
//    }
  }

}
